// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef MEDIA_MIDI_MIDI_INPUT_PORT_ANDROID_H_
#define MEDIA_MIDI_MIDI_INPUT_PORT_ANDROID_H_

#include <jni.h>
#include <stddef.h>
#include <stdint.h>

#include "base/android/scoped_java_ref.h"
#include "base/time/time.h"

namespace midi {

class MidiInputPortAndroid final {
public:
    class Delegate {
    public:
        virtual ~Delegate() { }
        virtual void OnReceivedData(MidiInputPortAndroid* port,
            const uint8_t* data,
            size_t size,
            base::TimeTicks time)
            = 0;
    };
    MidiInputPortAndroid(JNIEnv* env, jobject raw, Delegate* delegate);
    ~MidiInputPortAndroid();

    // Returns true when the operation succeeds.
    bool Open();
    void Close();

    // Called by the Java world.
    void OnData(JNIEnv* env,
        const base::android::JavaParamRef<jobject>& caller,
        const base::android::JavaParamRef<jbyteArray>& data,
        jint offset,
        jint size,
        jlong timestamp);

    static bool Register(JNIEnv* env);

private:
    base::android::ScopedJavaGlobalRef<jobject> raw_port_;
    Delegate* const delegate_;
};

} // namespace midi

#endif // MEDIA_MIDI_MIDI_INPUT_PORT_ANDROID_H_
